我正在尝试从另一个Activity
生成的文本文件中导入文本。生成的文本文件由String
ArrayList
组成,其中仅包含数字和Android生成的其他随机文本。当我从文件中导入文本时,我正在使用BufferedReader
和readLine()
将每个新号码添加到Integer
ArrayList
。我正在从文本文件中删除任何非数字值,而在另一个Activity中生成的数字将被“\ n”拆分。
我遇到的问题是Android在加载Activity
时崩溃了。我把原因缩小到Integer.parseInt()
。
我的代码如下:
ArrayList<Integer> lines = new ArrayList<Integer>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
File file = new File(getFilesDir(), "test_file.txt");
try {
BufferedReader br = new BufferedReader(new FileReader(file));
while (br.readLine() != null) {
String text = (br.readLine()).replaceAll("[^0-9]+","").trim();
Integer number = Integer.parseInt(text);
lines.add(number);
}
} catch (IOException e) {
}
TextView tv = (TextView) findViewById(R.id.helptext);
int max = 0, min = 100;
double total = 0;
for (int i = 0; i < lines.size(); i++) {
int number = lines.get(i);
max = Math.max(max, number);
min = Math.min(min, number);
total += number;
}
tv.setText("max = " + max + " min = " + min + " total = "
+ total);
答案 0 :(得分:10)
问题:
当您执行replaceAll("[^0-9]+","")
时,您最终会遇到空字符串,导致Integer.parseInt
抛出NumberFormatException
。
您正在跳过其他所有行(您的while
循环条件会消耗第一行,第三行等等...)
while (br.readLine() != null) // consumes one line
尝试这样的事情:
BufferedReader br = new BufferedReader(new FileReader(file));
String input;
while ((input = br.readLine()) != null) {
String text = input.replaceAll("[^0-9]+","");
if (!text.isEmpty())
lines.add(Integer.parseInt(text));
}
答案 1 :(得分:3)
以上所有答案都是正确的,但如果由于某些原因而出现的数据不是Integer
,他们将无法帮助您。例如,服务器错误地发送了你的用户名而不是userId(应该是一个整数)。
这可能发生,所以我们必须始终进行检查以防止它。否则,我们的应用程序将崩溃,它不会是一个愉快的用户体验。因此,在将String
转换为Integer
时,请始终使用try-catch
块来防止应用崩溃。我使用以下代码来防止因整数解析而导致应用程序崩溃 -
try {
Log.d(TAG, Integer.parseInt(string));
} catch (NumberFormatException e) {
Log.w(TAG, "Key entered isn't Integer");
}
答案 2 :(得分:0)
确保text
仅字符串中的数字,可能不是。您也可以尝试:
Integer number = Integer.valueOf(text);
而不是:
Integer number = Integer.parseInt(text);
请参阅:
parseInt()返回原始整数类型(int),其中valueOf 返回java.lang.Integer,它是代表的对象 整数。在某些情况下,您可能需要Integer 对象,而不是原始类型。
编辑:在下面的评论之后,我每次都会在循环中记录text
,很可能它会抛出错误,日志会显示text
变量为空。
答案 3 :(得分:-1)
如果您将数字设为字符串,如“1234”,则不会出现任何异常或错误。但是你会给任何字符或特殊字符,然后parse()函数会抛出异常。因此,请仔细检查必须有一些字符正在传递,因此它会抛出异常并导致崩溃