while(true) 循环中 try-catch 输入类型,无限循环问题

判断用户输入是否为整数,如果不是就重新输入。考虑用 try-catch 实现。

最开始出现了一个问题:

输入一次非整数后,出现请输入和输入有误无限循环。

代码如下:

Scanner scanner = new Scanner(System.in);
int num = 0;
while(true){

    System.out.println("请输入一个整数:");
    try {
        num = scanner.nextInt();
        break;
    } catch (InputMismatchException e) {
        System.out.println("输入有误,请重新输入");
    }
}

查询得知,外置声明会使 Scanner 对象中数据无法清除。

将 Scanner 声明置于循环内部即可。

int num = 0;
while(true){
    Scanner scanner = new Scanner(System.in);//将 scanner 内置
    System.out.println("请输入一个整数:");
    try {
        num = scanner.nextInt();
        break;
    } catch (InputMismatchException e) {
        System.out.println("输入有误,请重新输入");
    }
}

参见:http://t.csdn.cn/lDYU4

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
C++智能指针循环引⽤问题分析 C++11引⼊了三种智能指针,分别是shared_ptr、weak_ptr和unique_ptr 智能指针的作⽤ 智能指针可以帮助我们管理动态分配的堆内存,减少内存泄漏的可能性 ⼿动管理堆内存有引起内存泄漏的可能,⽐如这段代码 try { int* p = new int; // Do something delete p; } catch(...) { // Catch exception } 如果在执⾏Do something的时候发⽣了异常,那么程序就会直接跳到catch语句捕获异常,delete p这句代码不会被执⾏,发⽣了内存泄 漏 我们把上⾯的程序改成 try { shared_ptr<int> p(new int); // Do something } catch(...) { // Catch exception } 当执⾏Do something的时候发⽣了异常,那么try的栈对象都会被析构。因此代码p的析构函数会被调⽤,引⽤计数从1变成0,通过 new分配的堆内存被释放,这样就避免了内存泄漏的问题 循环引⽤问题 虽然智能指针会减少内存泄漏的可能性,但是如果使⽤智能指针的⽅式不对,⼀样会造成内存泄漏。⽐较典型的情况是循环引⽤问题,⽐如 这段代码 class B; // 前置声明 class A { public: shared_ptr<B> ptr; }; class B { public: shared_ptr<A> ptr; }; int main() { while(true) { shared_ptr<A> pa(new A()); shared_ptr<B> pb(new B()); pa -> ptr = pb; pb -> ptr = pa; } return 0; } 这个程序智能指针的引⽤情况如下图 上图,class A和class B的对象各⾃被两个智能指针管理,也就是A object和B object引⽤计数都为2,为什么是2? 分析class A对象的引⽤情况,该对象被main函数的pa和class B对象的ptr管理,因此A object引⽤计数是2,B object同理。 在这种情况下,在main函数⼀个while循环结束的时候,pa和pb的析构函数被调⽤,但是class A对象和class B对象仍然被⼀个智能指 针管理,A object和B object引⽤计数变成1,于是这两个对象的内存⽆法被释放,造成内存泄漏,如下图所⽰ 解决⽅法 解决⽅法很简单,把class A或者class B的shared_ptr改成weak_ptr即可,由于weak_ptr不会增加shared_ptr的引⽤计数,所以A object和B object有⼀个的引⽤计数为1,在pa和pb析构时,会正确地释放掉内存 ————————————————

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值