Java 数字格式问题,新手项目
我正在尝试编写一个程序,加载一个电影数据库文件,然后将这些信息拆分为电影标题、年份和所有相关演员。我拆分了所有信息,但在将字符串中的年份转换为整数时遇到问题。年份字符串的格式为(****),其中*为年份,例如1999年。当我尝试使用parse时,我得到一个数字格式异常。我尝试过替换括号,但它只是给了我更多的错误!有什么想法吗Java 数字格式问题,新手项目,java,numberformatexception,Java,Numberformatexception,我正在尝试编写一个程序,加载一个电影数据库文件,然后将这些信息拆分为电影标题、年份和所有相关演员。我拆分了所有信息,但在将字符串中的年份转换为整数时遇到问题。年份字符串的格式为(****),其中*为年份,例如1999年。当我尝试使用parse时,我得到一个数字格式异常。我尝试过替换括号,但它只是给了我更多的错误!有什么想法吗 public class MovieDatabase { ArrayList<Movie> allMovie = new ArrayList<Movie
public class MovieDatabase {
ArrayList<Movie> allMovie = new ArrayList<Movie>();
//Loading the text file and breaking it apart into sections
public void loadDataFromFile( String aFileName) throws FileNotFoundException{
Scanner theScanner = new Scanner(aFileName);
theScanner = new Scanner(new FileInputStream("cast-mpaa.txt"));
while(theScanner.hasNextLine()){
String line = theScanner.nextLine();
String[] splitting = line.split("/" );
String movieTitleAndYear = splitting[0];
int movieYearIndex = movieTitleAndYear.indexOf("(");
String movieYear = movieTitleAndYear.substring(movieYearIndex);
System.out.println(movieYear);
//this is where I have issues
int theYear = Integer.parseInt(movieYear);
String movieTitle = movieTitleAndYear.substring(0, movieYearIndex);
ArrayList<Actor> allActors = new ArrayList<Actor>();
for ( int i = 1; i < splitting.length; i++){
String[] names = splitting[i].split(",");
String firstName = names[0];
Actor theActor = new Actor(firstName);
ArrayList<Actor> allActor = new ArrayList<Actor>();
allActor.add(theActor);
}
Movie theMovie = new Movie(movieTitle, theYear, allActors);
allMovie.add(theMovie);
}
theScanner.close();
}
以下是我得到的错误:
Exception in thread "main" java.lang.NumberFormatException: For input string: "(1967)"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:481)
at java.lang.Integer.parseInt(Integer.java:527)
at MovieDatabase.loadDataFromFile(MovieDatabase.java:27)
数字周围有括号。您可以更正文件,也可以使用以下方法删除括号:
String str = "(1967)";
System.out.println(str.substring(1, str.length()-1));
Output:
1967
在代码中,您使用了:
int movieYearIndex = movieTitleAndYear.indexOf("(");
String movieYear = movieTitleAndYear.substring(movieYearIndex);
所以,如果我的movieTitleAndYear字符串是“hi(1947)”,indexOf将给我索引“(”as 3),子字符串将从索引3开始读取字符串,其中包括“(”。避免打开括号的一种方法是将子字符串行更改为:
String movieYear = movieTitleAndYear.substring(movieYearIndex + 1);//but still you have closing bracket.
如果您确定它始终是四位数,那么您可以执行以下操作:
String movieYear = movieTitleAndYear.substring(movieYearIndex + 1, movieYearIndex + 5);
您的
子字符串
调用当前会得到一个用括号括起来的年份,例如,(1967)
。您可以通过调用来避免这种情况,只需得到年份的四位数字:
String movieYear =
movieTitleAndYear.substring(movieYearIndex + 1, // to get rid of "("
movieYearIndex + 5 // to get rid of ")"
);
您需要为“)”添加indexof。 代码段:
int movieYearOpenBracesIndex = movieTitleAndYear.indexOf("(");
int movieYearCloseBracesIndex = movieTitleAndYear.indexOf(")");
String movieYear = movieTitleAndYear.substring(movieYearOpenBracesIndex + 1, movieYearCloseBracesIndex);
System.out.println(movieYear);
这将给出确切的年份。例如,1967年。请添加stacktrace。并从文件中提取样本数据。在将其解析为
int
之前打印movieYear
,并打印movieYear
的值。与jbniset达成一致,打印movieYear将显示您的问题。最可能的问题是子字符串的结尾。在子字符串中(movieYearIndex);您只提到年初字符串,而没有提到年末字符串索引。如果年份像(xxxx),行字符串movieYear=movieTitleAndYear.substring(movieYearIndex);是错误的,因为它将返回类似xxxx的字符串)您缺少两个参数之间的昏迷:)@AlexandreLavoie多么尴尬:-)谢谢!(固定)
int movieYearOpenBracesIndex = movieTitleAndYear.indexOf("(");
int movieYearCloseBracesIndex = movieTitleAndYear.indexOf(")");
String movieYear = movieTitleAndYear.substring(movieYearOpenBracesIndex + 1, movieYearCloseBracesIndex);
System.out.println(movieYear);