我的Java任务中有两个错误

时间:2011-05-24 19:50:37

标签: java

这是我目前的代码:

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

我不确定如何修复它们。

9 个答案:

答案 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。