用户定义异常

时间:2021-04-28 07:16:45

标签: java exception

我对这段代码有一些问题。我收到此错误:: 检查是否在 getCandidateDetails 方法中正确抛出异常。尽管测试用例通过了 85%。

候选人.java

public class Candidate {
    
    private String name;
    private String gender;
    private double expectedSalary;
    
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getGender() {
        return gender;
    }
    public void setGender(String gender) {
        this.gender = gender;
    }
    public double getExpectedSalary() {
        return expectedSalary;
    }
    public void setExpectedSalary(double expectedSalary) {
        this.expectedSalary = expectedSalary;
    }
}

Main.java

import java.util.*;
public class Main{
    public static void main (String[] args) {
        /* code */
        
    }
       public static Candidate getCandidateDetails() throws InvalidSalaryException{
           try{
           Scanner sc = new Scanner(System.in);
           String name = sc.nextLine();
           String gender = sc.nextLine();
           double expectedSalary = sc.nextDouble();
           if(expectedSalary < 10000){
               throw new InvalidSalaryException("Registration Failed. Salary cannot be less than 10000.");
           }
           Candidate c = new Candidate();
           return c;
           
           }catch(InvalidSalaryException ex){
               return null;
           }
           
       }
}

InvalidSalaryException.java

public class InvalidSalaryException extends Exception{
    public InvalidSalaryException(String str){
        super(str);
    }
}

2 个答案:

答案 0 :(得分:3)

我不确定您的问题,但是:

<块引用>

此代码有一些问题。我收到此错误::检查是否 在 getCandidateDetails 方法中正确抛出异常。 虽然 测试用例通过了 85%。

如果你的代码这样做(我缩进了它):

public static Candidate getCandidateDetails() throws InvalidSalaryException { // (1)
  try{
    Scanner sc = new Scanner(System.in);
    String name = sc.nextLine();
    String gender = sc.nextLine();
    double expectedSalary = sc.nextDouble();
    if(expectedSalary < 10000){
      throw new InvalidSalaryException("Registration Failed. Salary cannot be less than 10000."); // (2)
    }
    Candidate c = new Candidate();
    return c;
  } catch (InvalidSalaryException ex) { // (3)
    return null;
  }
}

然后

  1. 您告诉 Java 该方法可能会抛出 InvalidSalaryException
  2. 您正在抛出上述异常。
  3. 您在返回 null 之前捕获了异常。

您应该捕获异常并将其交给父调用者。

此外,如果您正在对这种方法进行单元测试,那么如果您使用 System.in,就会遇到严重的麻烦。

答案 1 :(得分:2)

如果您想测试方法 <?xml version="1.0" encoding="UTF-8"?> -<Root DotCoverVersion="2021.1.2" ReportType="Xml" CoveragePercent="97" TotalStatements="108" CoveredStatements="105"> -<Assembly CoveragePercent="94" TotalStatements="54" CoveredStatements="51" Name="ClassLibrary1"> -<Namespace CoveragePercent="94" TotalStatements="54" CoveredStatements="51" Name="ClassLibrary1"> -<Type CoveragePercent="94" TotalStatements="54" CoveredStatements="51" Name="Class1"> <Method CoveragePercent="100" TotalStatements="3" CoveredStatements="3" Name="Add(int,int):int"/> <Method CoveragePercent="100" TotalStatements="16" CoveredStatements="16" Name="Armstrong(int):string"/> <Method CoveragePercent="100" TotalStatements="5" CoveredStatements="5" Name="Decision(int):int"/> <Method CoveragePercent="79" TotalStatements="14" CoveredStatements="11" Name="isApplicable(int):string"/> <Method CoveragePercent="100" TotalStatements="3" CoveredStatements="3" Name="sub(int,int):int"/> <Method CoveragePercent="100" TotalStatements="13" CoveredStatements="13" Name="total(int):int"/> </Type> </Namespace> </Assembly> -<Assembly CoveragePercent="100" TotalStatements="54" CoveredStatements="54" Name="UnitTestProject2"> -<Namespace CoveragePercent="100" TotalStatements="54" CoveredStatements="54" Name="UnitTestProject2"> -<Type CoveragePercent="100" TotalStatements="54" CoveredStatements="54" Name="TestDemo"> <Method CoveragePercent="100" TotalStatements="5" CoveredStatements="5" Name="Test_Add():void"/> <Method CoveragePercent="100" TotalStatements="5" CoveredStatements="5" Name="Test_Armstrong_False():void"/> <Method CoveragePercent="100" TotalStatements="5" CoveredStatements="5" Name="Test_Armstrong_InvalidNumber():void"/> <Method CoveragePercent="100" TotalStatements="5" CoveredStatements="5" Name="Test_Armstrong_True():void"/> <Method CoveragePercent="100" TotalStatements="5" CoveredStatements="5" Name="Test_Decision_False():void"/> <Method CoveragePercent="100" TotalStatements="5" CoveredStatements="5" Name="Test_Decision_True():void"/> <Method CoveragePercent="100" TotalStatements="5" CoveredStatements="5" Name="Test_isApplicable_Applicable():void"/> <Method CoveragePercent="100" TotalStatements="5" CoveredStatements="5" Name="Test_isApplicable_NotValidAge():void"/> <Method CoveragePercent="100" TotalStatements="5" CoveredStatements="5" Name="Test_Sub():void"/> <Method CoveragePercent="100" TotalStatements="9" CoveredStatements="9" Name="Test_total():void"/> </Type> </Namespace> </Assembly> </Root> 是否创建了有效的对象/记录或抛出异常,请不要在内部捕获异常。

由于 getCandidateDetails(),您可以使用 Java 15 来存储数据而不是类,以减少样板代码。 https://dzone.com/articles/a-first-look-at-records-in-java-14

record