尝试/捕获异常,以便我可以返回一个数组值并打印出异常?

时间:2013-02-06 08:34:18

标签: java arrays exception try-catch

您好我正在编写一种彩票方法,用户必须输入两个数字n和k作为参数。彩票充满了随机队列,最多可达k。因此,如果我输入k = 10,队列将持有1,2,3,4,5,6,7,8,9,10。参数n是必须随机删除的项目数。因此,如果我选择3然后它可以返回4,6,8或者可能是1,3,10。

现在,如果n大于k,则必须抛出错误,表示队列中没有足够的项目来拉取。所以,如果我把n = 5和k = 3,队列中仍然有3个项目,但我不能从队列中选择5项,因为这太多了。

现在我的问题是我必须返回仍在队列中的项目。因此n = 5且k = 3将返回1,3,2或2,3,1等等。但是我必须在返回该数组后打印异常。到目前为止,我能够返回数组,但我无法使try catch异常工作。是否有另一种方法我可以尝试返回数组,然后打印出异常,所以它看起来像这样:

%java Lottery 5 2 //calls the method with the arguments n=5 k=2
2  1    //still prints the items in the queue
java.lang.Exception: Not enough items in your queue. // returns the error as well
at Lottery.pickNumbers(Lottery.java:29) //dont pay attention to these line numbers, this was a test case given to us
at Lottery.main(Lottery.java:56)

这是我的代码:

import java.util.*;
import java.math.*;
public class Lottery{
    RandomizedQueue rq;
    Random Rnum = new Random();
    int [] Larray;

    // constructs a Lottery class
    public Lottery(){
    }


    // picks the numbers and store them in an array of integers
    // int n: number of items to pick
    // int k: maximum integer to be picked

   public int [] pickNumbers(int n, int k) throws Exception{

        rq = new RandomizedQueue();

        int [] remainQueue = new int [k];


        if(n>k) 
        {
            for(int i=1; i<=remainQueue.length;i++)
            {
                rq.enqueue(i);
            }
                for(int i=0; i<remainQueue.length;i++)
                {
                    remainQueue[i] = rq.dequeue();
                }
                return remainQueue; 
        }  





        for(int i =1;i<=k;i++)
        {
            rq.enqueue(i);
        }

        Larray = new int[n];
        for(int i = 0;i< Larray.length;i++)
        {
            Larray[i] = rq.dequeue();
        }

        return Larray;


    }



    // Do not change main().
    public static void main(String [] args) throws Exception{
        if (args.length<2){
           System.out.println("Please enter your input values.");
           System.out.println("e.g. java Lottery [number of integers to pick] [Maximum integer to be picked]");
       }else{
           int n = Integer.parseInt(args[0]);
           int k = Integer.parseInt(args[1]);
           Lottery l = new Lottery();
           try{
           int [] picked = l.pickNumbers(n,k);
           for (int i = 0; i< picked.length; i++){
               System.out.print(picked[i]+" ");
           }
           System.out.println();
           }catch (Exception e){
           e.printStackTrace();
           }
       }



    } 

}

8 个答案:

答案 0 :(得分:2)

为此,您需要创建自己的自定义异常。 按照步骤。 - &GT;创建一个扩展异常的类 - &GT;编写自己的例外和处理 说,

public class MyException extends Exception {
// special exception code goes here
}

将其扔为:

throw new MyException ("Something happened")

Catch as:

catch (MyException e)
{
// something
}

在你的情况下     如果(N

答案 1 :(得分:1)

更改主要方法,如下面的代码。在没有异常的情况下,如果异常jut得到以前填充的数组并显示该结果,您将获得预期的结果。通过这种方式,您将获得填充结果以及异常。

import java.util.*;
import java.math.*;
public class Lottery{
    RandomizedQueue rq;
    Random Rnum = new Random();
    int [] Larray;

    // constructs a Lottery class
    public Lottery(){
    }


    // picks the numbers and store them in an array of integers
    // int n: number of items to pick
    // int k: maximum integer to be picked

   public int [] pickNumbers(int n, int k) throws Exception{

        rq = new RandomizedQueue();

        int [] remainQueue = new int [k];


        if(n>k) 
        {
            for(int i=1; i<=remainQueue.length;i++)
            {
                rq.enqueue(i);
            }
                for(int i=0; i<remainQueue.length;i++)
                {
                    remainQueue[i] = rq.dequeue();
                }
                return remainQueue; 
        }  





        for(int i =1;i<=k;i++)
        {
            rq.enqueue(i);
        }

        Larray = new int[n];
        for(int i = 0;i< Larray.length;i++)
        {
            Larray[i] = rq.dequeue();
        }

        return Larray;


    }



    // Do not change main().
    public static void main(String [] args) throws Exception{
        if (args.length<2){
           System.out.println("Please enter your input values.");
           System.out.println("e.g. java Lottery [number of integers to pick] [Maximum integer to be picked]");
       }else{
           int n = Integer.parseInt(args[0]);
           int k = Integer.parseInt(args[1]);
           Lottery l = new Lottery();
           try{
           int [] picked = l.pickNumbers(n,k);
           for (int i = 0; i< picked.length; i++){
               System.out.print(picked[i]+" ");
           }
           System.out.println();
           }catch (Exception e){
               int [] picked = l.Larray;
               for (int i = 0; i< picked.length; i++){
                   System.out.print(picked[i]+" ");
               }
               System.out.println();


           e.printStackTrace();
           }
       }



    } 

}

答案 2 :(得分:1)

你做不到。这样做甚至没有意义。异常用于异常行为。根据我的理解,要求的项目多于队列中的项目,是预期的行为(即你有一个用例说“返回剩余的队列”。因此,如果你想处理错误,你应该简单地做一些事情。

if (picked.length != k)
{
  System.out.println("You are attempting to choose more numbers than there are items (left) in the pool");
}

或者,因为您事先知道值n和K,所以您可以简单地进行一些输入验证

if (k>n)
{
  System.out.println("The amount of available numbers is smaller than the amount of numbers you wish to draw.")
}

此外,您应该使用Set而不是Array。

答案 3 :(得分:1)

我就是这样做的。完整的工作代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Lottery {
    public void pickNumbers (int n, int k, List<Integer> values)
        throws Exception
    {
        RandomizedQueue <Integer> rq = new RandomizedQueue <Integer> ();

        for (int i = 0; i < k; i++)
            rq.enqueue (i);

        if (n <= k)
        {
            for (int i = 0; i < n; i++)
                values.add (rq.dequeue ());
        }
        else
        {
            for (int i = 0; i < k; i++)
                values.add (rq.dequeue ());

            throw new Exception ("N > K");
        }
    }

    public static void main (String [] args)
    {
        int n = Integer.parseInt (args [0]);
        int k = Integer.parseInt (args [1]);
        Lottery l = new Lottery ();
        List <Integer> picked = new ArrayList <Integer> (n);
        try
        {
            l.pickNumbers (n, k, picked);
        } 
        catch (Exception e)
        {
            e.printStackTrace();
        }

        for (int i = 0; i < picked.size (); i++){
            System.out.print (picked.get (i) + " ");
        }
        System.out.println();
    }

    private static class RandomizedQueue <T> extends ArrayList <T>
    {
        private final Random r = new Random ();

        public void enqueue (T x)
        {
            add (x);
        }

        public T dequeue ()
        {
            return remove (r.nextInt(size ()));
        }
    }
}

答案 4 :(得分:0)

您可以从方法返回抛出异常值,两者都不能一次完成。

您可以创建自定义Exception类,并在此处保留处理结果,并在出现异常时抛出该结果。

public class MyException extends Exception{
     private int[] processedResult;
     public MyException(String str,int[] result){
        this.processedResult = result;
     }
     ...
     @override
     public String toString(){
       ....
     }
} 

...

public int [] pickNumbers(int n, int k) throws MyException{
    int[] larray = new int[n];
    try{
       ...
    }catch(Exception ex){
        new MyException("...",larray );
    }
}

答案 5 :(得分:0)

尝试这种方法:

  1. main()
  2. 中创建一个列表
  3. 将该列表传递给pickNumbers()
  4. pickNumbers()返回void并将结果添加到列表中。
  5. 当您遇到错误时,抛出异常
  6. main()中,捕获异常。然后该列表将包含到目前为止已计算的所有结果。
  7. 或者,编写自己的异常,将现有结果作为参数接受。然后,main()可以从异常中读取它们。

答案 6 :(得分:0)

  • 您可以创建自己的Exception类型,该类型会覆盖setMessage

  • 或简单而非e.printStackTrace()使用e.getMessage()

答案 7 :(得分:0)

你不能同时抛出异常并同时返回一个值。

退后一步,看看你想要达到的目标。您需要从方法中返回多个值 - 数字列表和状态 - 这将建议我返回包含这些值而不是普通int[]的复杂对象:

public class LotteryPick {
    public int status;
    public int[] numbers;
}

public LotteryPick pickNumbers(int n, int k) {
...
}

实际上,我使用Set<Integer>作为numbersstatus的枚举,可能是字段的getter / setter。

或者,如果必须抛出异常,请创建一个自定义异常类(... extends IllegalArgumentException?),该异常类也有一个int []字段来保存所选数字。我不推荐这种方法,但无论如何它在功能上与上述相同。