Java:来自被调用方法的“Break”循环?

我的小程序有点问题。 我有一个JOptionPane要求一个数字,如果这个数字小于10,那么一个循环只会持续不断地执行其中的内容,继续询问数字。 在该循环中,我调用一个方法,使用int作为参数。 在该方法中,我需要(不改变调用该方法的类中的任何代码)找出我输入的数字是否小于1.如果是,我需要调用另一个方法。 那一点完成了。

但! mainloop不断滚动,因此它继续在循环中执行其他操作。 我需要阻止它这样做,所以在方法的if语句中我需要打破方法所在的循环的特定迭代,并使其继续进行同一循环的新迭代,要求新号码。

第一堂课(例子):

 number=Integer.parseInt( JOptionPane.showInputDialog( "bla bla" ) ); while (number !=- 10) { themethod(number); blah blah ... } 

被调用的方法(例子):

 public void themethod(int number) { if (number<1) { call the other method break the iteration im in } 

你可以在这里做很多事情。 最终你所做的应该取决于你的编码风格以及你想要完成的事情。

选项1将是以下的一些变体:

 for (;;) { int number = /* ... */; myMethod(number); if (number == -10) break; } 

您可能会相当主观地并且根据情况说这是不好的,因为终止条件的知识包含在循环中而不是执行“实际工作”的方法中。 也许你的循环没问题。 也许在其他情况下(或者也许与其他程序员一起?这非常属于品味问题。)你可能想让myMethod做出这个决定。 一般来说,我自己的个人品味通常倾向于不在场景中的各种方法中分配场景知识,而是在一个地方。

因此,我将在此处撰写的大部分内容将是如何让myMethod决定是否终止。

选项2 – myMethod返回一个布尔值,表示我们应该终止:

 for (;;) { int number = /* ... */; if (myMethod(number)) break; } boolean myMethod(int number) { // TODO - do stuff return number == -10; } 

但是你可能会说myMethod已经想要返回其他类型了。 我来自非常C的背景,所以我最常用的成语是“out参数”。 引导我选择3:

选项3 – Out参数允许调用者决定终止:

 public class CancelIndicator { public boolean shouldCancel; }; CancelIndicator cancel = new CancelIndicator(); while (!cancel.shouldCancel) { int number = /* ... */; myMethod(number, cancel); } int myMethod(int number, CancelIndicator cancel) { // TODO - do stuff. cancel.shouldCancel = (number == -10); return /* ... */; } 

或者你可能更喜欢例外:

选项3:

 public class CancellationException extends Exception { } try { for (;;) { int number = /* ... */; myMethod(numberl); } } catch (CancellationException ex) { } void myMethod(int number) throws CancellationException { // TODO - do stuff. if (number == -10) throw new CancellationException(); } 

如您所见,有许多选择。 我相信人们可以花一整天时间谈论不同的方法。 这是我见过的成语样本 – 我会警告你,自从我用Java做了很多事以来已经有一段时间了,所以我可能不会在这里编写最惯用的代码。 🙂

添加一个返回值,指示while应该中断:

 public boolean themethod(int number) { if(number<1) { call the other method return true; } return false; } 

然后:

 while(number !=-10) { if(themethod(number)) break; bla bla ... } 

编辑 :如果您无法更改while代码,请从方法中抛出exception:

 public void themethod(int number) { if(number<1) { call the other method throw new RuntimeException("Negative Number"); } } 

等等,我也这样做了吗? 你有一个循环要求输入一个数字,如果数字不是-10就会有所作为,否则会中断?

如果是这样,看看这个:

 while(true) { number=Integer.parseInt( JOptionPane.showInputDialog( "bla bla" ) ); if(number == -10) { break; } themethod(number); } 

否则,如果不是这种情况,并且你想在两种情况下中断,-10情况和方法是假的情况,你可以这样做:

更改方法以返回布尔值。 如果这是真的,那么它不想破坏。 如果它是假的,那么它想要破解,然后这样做:

 while(true) { number=Integer.parseInt( JOptionPane.showInputDialog( "bla bla" ) ); if(number == -10) { break; } if(!themethod(number)) break; } 

如果你真的无法编辑循环,那么只需从方法中抛出一个exception! 但是,这将退出整个程序。 但是,我没有看到任何其他可行的方法。

没有themethod(int)的返回值并且没有更改其他类的代码,这是不可能的,因为它本身没有返回通信。 你必须改变两者; 如果不改变循环中的逻辑,就无法完成。