java.lang.NumberFormatException: For input string: ""怎么改??求教各位大神
代码如下:package knn;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;
//KNN算法测试
public class TestKNN{
//从数据文件中读取数据
//datas存储数据的集合对象
//path数据文件的路径
public void read(List> datas,String path){
try{
BufferedReader br = new BufferedReader(new FileReader(new File(path)));
String data = br.readLine();
List l = null;
while(data!=null){
String t[] = data.split("");
l = new ArrayList();
for(int i=0;i<t.length;i++){
l.add(Double.parseDouble(t[i]));
}
datas.add(l);
data = br.readLine();
br.close();
}
}catch(Exception e){
e.printStackTrace();
}
}
//程序入口
public static void main(String[] args){
TestKNN t = new TestKNN();
String trainData = new File("").getAbsolutePath()+File.separator+"trainData.txt";
String testData = new File("").getAbsolutePath()+File.separator+"testData.txt";
try{
List<List<Double>> datas = new ArrayList<List<Double>>();
List<List<Double>> testDatas = new ArrayList<List<Double>>();
t.read(datas,trainData);
t.read(testDatas,testData);
KNN knn = new KNN();
for(int i=0;i<testDatas.size();i++){
List<Double> test = testDatas.get(i);
System.out.print("测试元组:");
for (int j=0;i<test.size();j++){
System.out.print(test.get(j)+" ");
}
System.out.print("类别为:");
System.out.println(Math.round(Float.parseFloat((knn.knn(datas,test,3)))));
}
}catch(Exception e){
e.printStackTrace();
}
}
}
.NumberFormatException 数字格式化转化异常 是不是要格式的不是单纯的数字字符 如果有字母或者标点之类的是格式不了的 格式之前循环输出一下看看是不是都是数字
应该是这儿
System.out.println(Math.round(Float.parseFloat((knn.knn(datas,test,3)))));
改成Double的parse
while(data!=null){
String t[] = data.split("");
l = new ArrayList();
for(int i=0;i<t.length;i++){
l.add(Double.parseDouble(t[i]));
}
里面的
String t[] = data.split("");
改为
String t[] = data.split("\\s+");
//下面的最好也该:
String s=t[i].trim();
if(s.length()>0)
l.add(Double.parseDouble(t[i]));
1.作为一个老司机,我要说点题外话。
new File("").getAbsolutePath()+File.separator+"trainData.txt";
应该改成:
System.getProperty("user.dir")+File.separator+"trainData.txt"
2.不管是Float还是Double的parse方法都是可能抛出异常的,除非你能确定所parse的字符串一定不会导致异常,否则应该单独对调用parse方法的代码进行try-catch。
try{
Float.parseFloat("my string")
}catch(...){
...
}
3.如果你能确定所parse的字符串一定不会导致异常,那么就不需要try-catch。
if(MyUtils.isFloat("my string")){
Float.parseFloat("my string")
}else{
...
}
如何才能确定呢?答案是正则:
public static boolean isFloat(String str) {
return str.matches("(\\-|\\+){0,1}\\d*\\.\\d+");
}
楼上都说的很清晰,读取的值一定能够转化为double吗?程序自己可是不知道的,所以需要try catch以防万一。