2016-03-30 16 views
1

Şu anda, kullanıcının girdiği bir sayının faktöriyelini bulmak için özyinelemeyi kullandığı söylenen programlama ödevimi yaptım. Başarıyla yaptım ve işe yaradı, ancak kodu biraz genişletmeye ve tekmeler için bir istisna eklemeye karar verdim.Java özyineleme ve istisnalar

Temel olarak programın kullanıcıya 0'dan büyük veya 0'dan büyük bir sayı girmesini istediğini ve kullanıcının 0'dan küçük bir sayı girmesi durumunda, bir istisnanın atılmasını, yakalanmasını ve işlenmesini istiyorum. Bu kodda biliyorum StringTooLong olan yanlış özel durum kullanıyorum, ancak kafamın üstünden başka herhangi bir özel durum bilmiyorum. Kodumu çalıştırdığımda, throw lengthException numaralı telefondan bulamadığım bir hatayı alıyorum.

import java.util.Scanner; 

public class Recursion { 

    public static void main(String args[]) { 
     long userNum; 
     System.out.println("Enter a number to check it's factorial"); 
     Scanner scnr = new Scanner(System.in); 
     userNum = scnr.nextLong(); 
     StringTooLongException lengthException = 
     new StringTooLongException ("String has too many characters"); 

     System.out.println(fact(userNum)); 
    } 

    public static long fact(long userNum) { 
     try { 
     if(userNum < 0) { 
      throw lengthException; 
     } else if(userNum == 1 || userNum == 0) { 
      return 1; 
     } else { 
      return userNum*fact(userNum-1); 
     } 
     } catch(Exception e) { 
     System.out.println("Enter a number that is greater or equal to 0," + e); 
     } 

    } 
} 
+3

[IllegalArgumentException] (https://docs.oracle.com/javase/7/docs/api/java/lang/IllegalArgumentException.html) daha uygun olabilir. Ayrıca, "* kullanıcı, ** 'den daha az ** bir sayı girerse, bir istisna atılmasını istiyorum" demeyi düşünüyorum. * –

+1

"Yeni bir StringTooLongException()" a atmalısınız, inanıyorum, lengthException değil. Veya, lengthException öğesini 'if' deyimine taşıyabilirsiniz. – Tacocat

+3

Özel bir hata, lengthException yönteminin 'fact (long userNum)' kapsamı dışında olmasından kaynaklanır. Şahsen IllegalArgumentException düşünürdüm. – KevinO

cevap

2

Dene: Kaldırabileceğiniz

throw new StringTooLongException(); 

Ve aşağıdaki: @KevinO ve diğerleri tavsiye ettiler olarak

StringTooLongException lengthException = 
new StringTooLongException ("String has too many characters"); 

olsa da, İşte

kod bu IllegalArgumentException kullanarak daha uygun, örneğin

throw new IllegalArgumentException(); 

Veya, örneğin kendi özel Exception, oluşturabilir

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

Sen main yılında lengthException ilan etti ve fact kullanmak çalıştık. Bu nedenle fact(long userNum) yönteminin kapsamı dışındadır. Böylece sahip olduğunuz hata.

exceptions hakkında daha fazla bilgi için this'a bakabilirsiniz.

+1

Üzgünüz, yorumunuzu eklediğinizde bunu eklemek için düzenliyordum. Biraz yavaştım. Lütfen gözden geçirilmiş cevaba bakınız, @JonnyHenly – Tacocat

0

throw lengthException hatasını düzeltmek için new kullanmanız gerekir. Ayrıca, yeni StringTooLongException();

Ayrıca bir istisnanın ne olduğu ve ne için kullanıldığı hakkında daha fazla bilgi edinmelisiniz. Bir şey bir istisna aslında bir sınıftır ve özel durum sınıfının herhangi bir alt sınıfının kendisi bir özel durumdur. Yani, eğer isterseniz, sadece Exception sınıfını genişleterek kendi istisnayı yaratabilirsiniz. Bu nedenle, istisna atarken yeni anahtar kelimeyi kullanmanız gerekir: Yeni bir Özel Durum örneğini (veya alt sınıflarından birini) atarsınız.

JavaDoc for the Exception class'daki doğrudan bilinen alt sınıflar bölümünü araştırarak bazı üst düzey özel durumların listesini görebilirsiniz.

0

Sen NumberFormatException kullanabilirsiniz:

... 
if(userNum <= 0) 
{ 
    throw new NumberFormatException("Must be a positive integer"); 
} 
... 
} catch (NumberFormatException e) { 
    System.err.println("Enter a number that is greater or equal to 0," + e); 
} 
+0

Bunun tamamen uygun olduğundan emin değilim: http://alvinalexander.com/blog/post/java/java-faq-what-is-numberformatexception; ama yanılıyor olabilirim. – Tacocat

0

sizin uygulanması için temiz bir alternatif ihtiyaçlarınızı uygun kendi özel İstisna oluşturmaktır.

public class InvalidInputException() extends Exception 
{ 
    public InvalidInputException() 
    { 
     super(); 
    } 

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

Bu uygulama sizin try-catch bloğu içinde throw new InvalidInputException() sizi sağlayacak ve kullanıcıya daha bilgilendirici geçerli:

Örneğin, aşağıdaki gibi bir özel istisna sınıflarını oluşturabilir.