2

我被要求编写一段程序来使用 try 和 catch 处理异常。虽然,当我运行它时,它不会反映我的异常代码,因为应该打印“无效名称”。有人能指出原因吗?如果有人更正我的代码也将非常受欢迎!谢谢。

我需要在以下条件下编写一个程序:

导入 javax.naming.InvalidNameException。编写一个方法 public void printName(String name) throws InvalidNameException 如果 name 没有空格,该方法应该抛出一个 InvalidNameException。编写驱动程序进行测试。

===============Code result=============
Enter your name: James Dean        
First name: James
Last name: Dean
Enter your name: Brian Smith
First name: Brian
Last name: Smith
Enter your name: RuthKnight
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1
    at Name.printName(Name.java:33)
    at NameApp.main(NameApp.java:17)
==================Method============================
import javax.naming.InvalidNameException;

public class Name{

   public void printName(String name) throws InvalidNameException{

       String [] nameSplit = name.split(" ");
       String first = nameSplit[0];
       String last = nameSplit[1];

       System.out.println("First name: "+first);
       System.out.println("Last name: "+last);      
   }

}
======================Driver========================
import java.util.Scanner;
import javax.naming.InvalidNameException;


public class NameApp{

   public static void main(String[] args) {

      Name aa = new Name();
      Scanner console = new Scanner(System.in);
      try {
         boolean keepRunning= true;

         while(keepRunning){
            System.out.print("Enter your name: ");
            String in = console.nextLine();
            aa.printName(in);
         } 
      }
      catch(InvalidNameException e){
         System.out.println("invalid name");
      }
   }

}
4

6 回答 6

2

我建议在课堂上捕捉异常,然后Name像这样:throwInvalidNameException

public void printName(String name) throws InvalidNameException {
    try {
        String[] nameSplit = name.split(" ");
        String first = nameSplit[0];
        String last = nameSplit[1];

        System.out.println("First name: " + first);
        System.out.println("Last name: " + last);
    } catch (ArrayIndexOutOfBoundsException e) {
        throw new InvalidNameException("Missing space in: " + name);
    }
}

更新

运行此代码:

import javax.naming.InvalidNameException;
public class NameApp{
   public static void main(String[] args) {
      Name aa = new Name();
      try {
            System.out.print("Enter your name: ");
            String in = "George Den";
            aa.printName(in);
            in = "George";
            aa.printName(in);
      }
      catch(InvalidNameException e){
         System.out.println(e.toString());
      }
   }
}

import javax.naming.InvalidNameException;
public class Name {
    public void printName(String name) throws InvalidNameException {
        try {
            String[] nameSplit = name.split(" ");
            String first = nameSplit[0];
            String last = nameSplit[1];
            System.out.println("First name: " + first);
            System.out.println("Last name: " + last);
        } catch (ArrayIndexOutOfBoundsException e) {
            throw new InvalidNameException("Missing space in: " + name);
        }
    }
}

将打印这个:

输入您的姓名: 名字: George 姓氏: Den

javax.naming.InvalidNameException:缺少空格:乔治

更新 2

考虑@robjohncox 的建议。此代码不应按原样使用,因为javax.naming.InvalidNameException仅应在特定情况下抛出,例如 LDAP 查找和通常的目录特定操作。

最适合您的是子类 Exception Object 并创建自己的异常(另请参阅我如何编写自定义异常?):

public class MyCustomNamingException extends Exception {
    public MyCustomNamingException(){
    }
    public MyCustomNamingException(String message){
        super(message);
    }
}

然后MyCustomNamingException在您的代码中使用它,如之前使用InvalidNameException

于 2013-07-03T07:29:44.363 回答
1

只需执行以下操作:

if (name.contains(" ")) {

} else {

throw new InvalidNameException ("Name does not contain the space");
}
于 2013-07-03T07:23:43.293 回答
1

行为如预期,异常由行触发

String last = nameSplit[1]

因为 "RuthKnight".split(" ") 的结果是一个包含单个元素的数组,因此它在位置 1 处没有元素(导致ArrayIndexOutOfBoundsException被抛出)。

异常类型不会在您的代码中的任何地方抛出javax.naming.InvalidNameException,并且您不应该真正使用它,因为此异常是为.javax.naming

你应该像这样修改你的代码:

String in = console.nextLine();
if (in.contains(" ") {
     aa.printName(in);
}
else {
    System.out.println("invalid name");
}
于 2013-07-03T07:25:46.393 回答
0

您需要检查输入的名称是否可拆分,如果不是,那么您没有价值name[1],这就是它抛出异常的原因

于 2013-07-03T07:24:21.257 回答
0

我输入的这个场景命名为RuthKnigh名称字符串仅包含单个字符串。

而不是这个

String [] nameSplit = name.split(" ");
String first = nameSplit[0];
String last = nameSplit[1];

if

if( name.contains(" "))
 {
  String [] nameSplit = name.split(" ");
  String first = nameSplit[0];
  String last = nameSplit[1];
 }
于 2013-07-03T07:26:24.830 回答
0
   String[] nameSplit = name.split(" +", 2);
   if (nameSplit.length < 2) {
       throw new InvalidNameException ("Missing space in: " + name);
   }

split 的可选参数 2 表示最大拆分次数。试试“何塞·德尔雷”。

于 2013-07-03T07:28:00.717 回答