这是我目前的代码:
import java.lang.String;
import java.io.*;
class InvalidAgeException extends Exception
{
public InvalidAgeException()
{
super("The age you entered is not between 0 and 125");
}
}
public class questionOne
{
public static void main(String args[])
{
System.out.println("What is your name?");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name;
try
{
name = br.readLine();
}
catch(IOException e)
{
System.out.println("Error: " + e);
System.exit(1);
}
System.out.println("Hello " + name + ", how old are you?");
String i;
int age;
try
{
i = br.readLine();
age = Integer.valueOf(i);
}
catch(IOException e)
{
System.out.println("Error: " + e);
System.exit(1);
}
catch(InvalidAgeException e)
{
System.out.println("Error: " + e);
System.exit(1);
}
finally
{
System.out.println("No errors found.");
}
}
}
分配是编写一个程序,询问用户的姓名和年龄,如果年龄不在0到125之间则抛出异常。我的代码中出现了两个错误:
questionOne.java:31: variable name might not have been initialized
System.out.println("Hello " + name + ", how old are you?");
^
questionOne.java:46: exception InvalidAgeException is never thrown in body of corresponding try statement
catch(InvalidAgeException e)
^
2 errors
我不确定如何修复它们。
答案 0 :(得分:3)
您的第一个错误是因为从不初始化名称。请记住,它仅在Try Catch块中初始化,这会导致编译器抛出错误,因为它可能永远不会在程序中初始化。所以改变你在try catch块之上的行
String name = "";
将解决该错误。
编辑:
这可能是你需要在try catch块之外做的事情。
if (age < 0 || age > 125){
throw new InvalidAgeException();
}
答案 1 :(得分:2)
questionOne.java:31: variable name might not have been initialized
System.out.println("Hello " + name + ", how old are you?");
这是因为在使用函数之前需要初始化函数内部的变量。当您尝试在函数内部使用未初始化的变量时,编译器会抛出异常。
所以,试试这个
String name = " ";
questionOne.java:46: exception InvalidAgeException is never thrown in body of corresponding try statement
catch(InvalidAgeException e)
你没有把InvalidAgeException
扔到任何地方(因此编译器抱怨)。
试试这个,
if (age < 0 || age > 125){
throw new InvalidAgeException("This is an invalid age :" + age);
}
答案 2 :(得分:0)
你可以String name="";
年龄也可以初始化。
当你达到年龄时,你需要进行检查,如果超出范围,抛出异常,它将不会自动出现。
答案 3 :(得分:0)
他们都给你解决方案。只需将变量初始化为:
String name = null;
而对于第二个,没有人抛出异常。执行readline
后进行检查,如果解析后的值小于0或大于125,请执行以下操作:
throw new InvalidAgeException();
答案 4 :(得分:0)
初始化名称。当你点击System.exit(1);
时,编译器不够聪明,不知道程序会终止在try块中任何已执行的代码都不会抛出InvalidAgeException,因此没有必要,至少还没有你的代码。
编译器具有非常具有描述性的消息。
答案 5 :(得分:0)
第一个错误很简单:将name
初始化为null或为空。
第二个实际上是因为你还没有解决你的作业而引起的;)提示:验证在哪里?
答案 6 :(得分:0)
您可以通过将声明更改为:
来消除第一个错误String name = new String();
这令人抱怨,因为它看到了代码中没有分配名称的路径。 (例如,如果readLine()抛出了IOException之外的其他东西,例如)。
第二个错误是因为你没有在任何地方抛出InvalidAgeException,所以它认为你不需要那个catch块。
答案 7 :(得分:0)
我建议您尝试简化代码。你编写的代码越多,就越难以看到你的程序实际上做了什么......
public static void main(String... args) throws IOException, InvalidAgeException {
System.out.println("What is your name?");
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String name = br.readLine();
System.out.println("Hello " + name + ", how old are you?");
int age = Integer.parseInt(br.readLine());
if (age < 0 || age > 125)
throw new InvalidAgeException();
System.out.println("No errors found, you are " + age + " years old");
}
答案 8 :(得分:0)
第一个错误的问题就像编译NullPointerException。
...
String name; //Name is basically null and compiler does not want to throw a NullPointerException.
...
System.out.println("Hello " + name + ", how old are you?");
而是试试这个:
String name = "";
...
第二个错误: 基本上永远不会抛出InvalidAgeException,所以为什么要抓住它。 这就是编译器所抱怨的。 你应该做的是在某处抛出你的InvalidAgeException。