您好我正在编写一种彩票方法,用户必须输入两个数字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();
}
}
}
}
答案 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)
尝试这种方法:
main()
pickNumbers()
pickNumbers()
返回void
并将结果添加到列表中。main()
中,捕获异常。然后该列表将包含到目前为止已计算的所有结果。或者,编写自己的异常,将现有结果作为参数接受。然后,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>
作为numbers
,status
的枚举,可能是字段的getter / setter。
或者,如果必须抛出异常,请创建一个自定义异常类(... extends IllegalArgumentException
?),该异常类也有一个int []字段来保存所选数字。我不推荐这种方法,但无论如何它在功能上与上述相同。