首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >自定义异常不断给我“异常:未知异常”。

自定义异常不断给我“异常:未知异常”。
EN

Stack Overflow用户
提问于 2016-05-21 20:46:34
回答 2查看 53关注 0票数 2

在我的程序中,我已经创建了一个自定义的异常类实用程序,当用户输入一个非整数时,它应该返回" Exception : NON值输入“的异常。然而,每次我运行程序时,我都会得到“异常:未知异常”。拜托,有人能指引我走正确的路吗?非常感谢。

代码语言:javascript
复制
import java.util.Scanner;
import java.util.InputMismatchException;

class Date 
{
   public static final int JAN = 1;
   public static final int FEB = 2;
   public static final int MAR = 3;
   public static final int APR = 4;
   public static final int MAY = 5;
   public static final int JUN = 6;
   public static final int JUL = 7;
   public static final int AUG = 8;
   public static final int SEP = 9;
   public static final int OCT = 10;
   public static final int NOV = 11;
   public static final int DEC = 12;

   static boolean isALeapYear(int year)
   {   
      return (((year % 100 != 0) && ((year % 4 == 0 ) || ((year % 400) == 0)) ));  
   }

   int returnDaysInMonth(int year, int month)
   {
      int [] daysInMonth = {0,31,28,31,30,31,30,31,31,30,31,30,31};
      int day = 0;// PROBLEM: THIS IS NEVER USED

      day = daysInMonth[month];

      if (isALeapYear(year))
      {
         if (month == FEB)
             {
            day ++;
             }
      }
      return day;        
   }

   int returnDaysInYear(int year)
   {
      return (isALeapYear(year)?366:365);
   }

   int determineJulianDate(int year, int month, int day)
   {
       int accumalator = 0; 

       for(int methodYear = 1900 ; methodYear < year ; methodYear++)
           {
         accumalator +=returnDaysInYear(methodYear);
           }
       for (int methodMonth = 1 ; methodMonth < month ; methodMonth++ )
           {
         accumalator +=returnDaysInMonth(year, methodMonth);
           }
       accumalator += day;

      return accumalator;
   }

   int determineYear (int julianDate)
   {
       int year = 1900 ; // PROBLEM: THIS IS NEVER USED
       for(year = 1900 ; julianDate > returnDaysInYear(year) ; year++)
           {
         julianDate -= returnDaysInYear(year);
           }

      return year;      
   }

   int determineMonth (int julianDate)
   {
       int month = 0;
       int year  = 0;
           year  = determineYear(year);// PROBLEM: THIS IS NEVER USED

       for(year = 1900 ; julianDate > returnDaysInYear(year) ; year++)
           {
          julianDate -= returnDaysInYear(year);
           }
       for(month = 0 ; julianDate > returnDaysInMonth(year, month) ; month++)
           {
          julianDate -= returnDaysInMonth(year, month);
           }

      return month;     
   }

   int determineDay (int julianDate)
   {
       int month = 0;
       int year  = 0;

       for(year = 1900 ; julianDate > returnDaysInYear(year) ; year++)
           {
          julianDate -= returnDaysInYear(year);
           }
       for(month = 0 ; julianDate > returnDaysInMonth(year, month) ; month++)
           {
          julianDate -= returnDaysInMonth(year, month);
           }
      return julianDate ;       
   }   

   int queryForValidYear()
   {
      int year = 0;

      try{
         do{
         year = Utility.queryForInt("Enter a year.");
            if(!isYearValid(year))
               System.out.println("Error: The year must be higher than 1900.");
         }while(!isYearValid(year));
      }catch(InputMismatchException in)
          {
                throw new DateException("Exception: Non-Integer value entered");
      }catch(Exception e)
          {
         throw new DateException("Exception: Unknown exception");
      }
      return year;     
   }

   int queryForValidMonth()
   {
      int month = 0;
          month = 0;

      try{
         do{
         month = Utility.queryForInt("Enter a month.");
            if(!isMonthValid(month))
               System.out.println("Error: The month must be 1-12.");
         }while (!isMonthValid(month)) ;
      }catch(InputMismatchException in)
      {
         throw new DateException("Exception: Non-Integer value entered");
      }catch(Exception e)
      {
         throw new DateException("Exception: Unknown exception");
      }
      return month; 
   }

   int queryForValidDay(int year, int month)
   {
      int day = 0;
          day = 0;

      try{
         do{
         day = Utility.queryForInt("Enter a day.");
            if(isDayValid(year, month, day))
               System.out.println("Error: Wrong amount of days for the month.");    
         }while (!isDayValid(year, month, day));
      }catch(InputMismatchException in)
          {
         throw new DateException("Exception: Non-Integer value entered");
      }catch(Exception e)
          {
         throw new DateException("Exception: Unknown exception");
      }
      return day;
   }

   boolean isYearValid(int year)
   {
      return ((year >= 1900));
   }

   boolean isMonthValid(int month)
   {
      return((month >= 1 && month <= 12));
   }

   boolean isDayValid(int year, int month, int day)
   {
      return ((day >= 1) && day <= returnDaysInMonth(year, month));
   }
}

 class Utility  extends Exception
 {

   static int queryForInt(String prompt)
   {
      Scanner keyboard = null;// PROBLEM: THIS IS NEVER USED
      int intValue     = 0;

      try{
         keyboard = new Scanner (System.in);
         System.out.print(prompt);
         intValue = keyboard.nextInt();
      }catch(InputMismatchException in)
          {
         throw new DateException("Exception: Non-Integer value entered");
      }catch(Exception e)
          {
         throw new DateException("Exception: Unknown exception");
      }     
      return intValue;
   }
}
class DateException extends RuntimeException 
{

    public DateException(){
        super();
    }

    public DateException(String message){
        super(message);
    }

    public DateException(String message, Throwable cause){
        super(message,cause);
    }

    public DateException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace){
        super(message, cause, enableSuppression, writableStackTrace);
    }
}
public class DateDriver 
{

   public static void main(String[] args) throws Exception//********
   {
      DateDriver ex = new DateDriver();
      ex.displayMessage();
   }
   public void displayMessage() throws Utility
   {
      int day       = 0;// PROBLEM: THIS IS NEVER USED
      int month     = 0;// PROBLEM: THIS IS NEVER USED
      int year      = 0;// PROBLEM: THIS IS NEVER USED
      int epocDays  = 0;// PROBLEM: THIS IS NEVER USED

      Date date = null;// PROBLEM: THIS IS NEVER USED
      date = new Date();

      year      = date.queryForValidYear();
      month     = date.queryForValidMonth();
      day       = date.queryForValidDay(year, month);
      epocDays  = date.determineJulianDate(year, month, day);

      System.out.println("Year is a leap year: " + Date.isALeapYear(year));
      System.out.println("The date entered is: " + month + "/" + day + "/" + year);
      System.out.println("Days since the EPOC are " + epocDays );
      System.out.println("Determine Year Says " + date.determineYear(epocDays) );
      System.out.println("Determine Month Says " + date.determineMonth(epocDays) );
      System.out.println("Determine Day Says " + date.determineDay(epocDays) );
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-21 20:55:35

这是很明显的:在线上

代码语言:javascript
复制
try{
      keyboard = new Scanner (System.in);
         System.out.print(prompt);
         intValue = keyboard.nextInt();
      }catch

捕捉到的异常不是InputMismatchException类型,而是其他类型的,您正在用ExceptionDateException("Exception: Unknown exception");重定向捕获另一个异常,这就是消息的来源。如果输入耗尽,则可以是NoSuchElementException,如果这个扫描器关闭,则为IllegalStateException (这些都是nextInt()抛出的内容)。

票数 1
EN

Stack Overflow用户

发布于 2016-05-21 21:03:37

您正在用正确的消息捕获自己的DateException,然后用错误的消息重新抛出一个新的消息。

  • queryForInt中,nextInt抛出一个InputMismatchException,然后用您想要的消息抛出一个DateException
  • 然后,在例如queryForValidDay中,您将该DateException捕获为普通的Exception,并抛出一个新的DateException,其中包含您不想要的消息。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37367819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档