java 为啥使用continue会使程序错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 为啥使用continue会使程序错误相关的知识,希望对你有一定的参考价值。

public class Test

public static void main(String[] args)
int b = 1000;
while(true)
if(b < 9)
continue;//改成break;就不会报错

b = b-9;

System.out.println(b);


Test.java:13: 错误: 无法访问的语句
System.out.println(b);
^
1 个错误

首先这不是死循环的问题,这个报错是编译抛出来的,死循环编译和运行都是不会报错的;
while(true)这之后的语句执行不到,所以报错无法访问。
这就跟你在return之后的代码一样,都返回了后面的代码能执行到么,抛错和这个一样,编译根本不能通过。
区别在哪呢?代码稍做改动就看出来了,将while(true)改成while(b<10000),同样是死循环,但是编译和运行都不会报错,这是因为我写的是一个表达式而你写的是常量,对于变量的值编译器是没有办法获取的,运行的时候才会分配内存,但是常量编译的时候就已经在内存中的方法区分配了空间,所以你编译不能通过但是我能通过。
参考技术A 你使用continue不就死循环了,continue是跳过循环后面的语句,b的值不变,继续下一次循环 下一次还是执行continue b的值还是不变,一直continue,一直b的值不变 死循环了。追问

死循环并没有语法问题,那为什么会报错。新手刚学。

追答

是没有语法问题 因为while是死循环了 后面的System.out.println(b);就执行不到了

应该是编译器检查过严 这不算语法问题。

本回答被提问者采纳
参考技术B break是结束整个循环体,continue是结束单次循环执行下依次循环。

你上面写的代码里,如果是continue的话会形成无限循环,也就是死循环。
参考技术C 你没发现是死循环吗?追问

那为什么会报错

追答

最常见的就是,内存溢出

追问

可给出的错误是 :无法访问的语句

参考技术D 不会,应该是你的程序出了问题了

为啥这个 xamarin Binding Converter 会使应用程序崩溃?

【中文标题】为啥这个 xamarin Binding Converter 会使应用程序崩溃?【英文标题】:Why this xamarin Binding Converter crashs the application?为什么这个 xamarin Binding Converter 会使应用程序崩溃? 【发布时间】:2020-08-30 02:57:19 【问题描述】:

我有一个布尔属性,我想将其否定值(!值)绑定到一个按钮,但是每次我在 xaml 标记中配置转换器时,它都会毫无例外地终止应用程序,我在应用程序中心没有发现任何错误.如果我删除这部分 , Converter=StaticResource inverter 一切都会恢复,但没有转换。

我的xml:

<ContentPage.Resources>
        <local:BooleanConverter x:Key="inverter" />
...

<ContentPage.Resources>

...

<controls:FrameButton IsEnabled="Binding IsBusy, Converter=StaticResource inverter" Margin="5" CornerRadius="5">

还有我的 BooleanConverter.cs:

using System;
using Xamarin.Forms;

public class BooleanConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        return !System.Convert.ToBoolean(value);
    

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        return !System.Convert.ToBoolean(value);
    

更新 1

框架按钮代码:

using Xamarin.Forms;

namespace CustomControls.Controls

    public class FrameButton : Frame
    
        public FrameButton()
        
            var MyTapGesture = new TapGestureRecognizer();
            MyTapGesture.Tapped += (sender, e) =>  Clicked(); ;
            GestureRecognizers.Add(MyTapGesture);
        

        public async void Clicked()
        
            await this.ScaleTo(1.1, 100);
            await this.ScaleTo(1, 100);
        
    

【问题讨论】:

尝试添加 try/catch,和/或使用调试器单步执行代码并跟踪错误 我使用您提供的代码进行测试,以设置按钮的布尔值。它运作良好。我们需要更多信息来重现。你能为此提供FrameButton吗?您是否尝试卸载并重新安装该应用程序或在其他设备上进行测试?应用程序是否再次崩溃? @Jason 已尝试 Convert(..) try catch 但没有输出任何内容 @WendyZang-MSFT 是的,我尝试在两个不同的设备中清理解决方案、重建和测试。我现在会用 FrameButton 更新我的问题 @ÉderRochaBezerra 我制作了代码示例以使用 FrameButton 进行测试。它运作良好。你可以从 GitHub 下载查看。 github.com/WendyZang/Test/tree/master/Converters/inverterDemo 【参考方案1】:

使用显式转换,因为您总是知道value 将是一个布尔值,除非您使用错误。一般不使用ConvertBack,因为它通常没有意义。

using System;
using Xamarin.Forms;

public class BooleanConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        return !((bool)value);
    

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    
        throw new NotImplementedException();
    

【讨论】:

我试过你的代码,但问题仍然存在......完全相同的问题。 你能发布一个堆栈跟踪吗?还是输出窗口信息? 我能找到的唯一信息是:[libc] Fatal signal 11 (SIGSEGV), code 2, fault addr 0x794bb2bce8 in tid 26734 (com.MyApp.Beta) 通常,如果您在输出窗格中继续向上滚动,您将能够找到实际的异常或至少提及您的代码位置。 在开始这个有问题的页面并仔细阅读之前,我正在清理所有内容,但没有别的了。【参考方案2】:

也许是因为它试图将 IsEnabled 值转换回来。 您是否尝试过使其成为OneWay 例如

IsEnabled="Binding IsBusy, Mode=OneWay, Converter=x:StaticResource BooleanConverter"

编辑考虑您的评论。

我认为 SEGSEGV 错误是内存分段错误,即内存读取错误。所以可能没有找到inverter

我发现其中一些深奥的错误消息通常是由 XAML 代码中的错误触发的。

我看到您对该页面的转换器声明是:

<ContentPage.Resources>
        <local:BooleanConverter x:Key="inverter" />
...

<ContentPage.Resources>

通常声明是:

<ContentPage.Resources>
    <ResourceDictionary>
        <local:BooleanConverter x:Key="inverter" />
...
    </ResourceDictionary>
<ContentPage.Resources>

我怀疑与被调用键“inverter”的关系没有声明,因为它不在ResourceDictionary

【讨论】:

我很有希望,但没有...同样的问题 =(

以上是关于java 为啥使用continue会使程序错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 C 中使用错误的格式说明符会使我的程序在 Windows 7 上崩溃?

为啥 GHUnit 的异步测试中的错误断言会使应用程序崩溃,而不仅仅是测试失败?

为啥这个 xamarin Binding Converter 会使应用程序崩溃?

带标签的 break 和 continue (Java)

为啥我的 unwind segue 会使我的应用程序崩溃?

为啥添加 try 块会使程序更快?