为什么我的异常无法throw抛出异常

20:12 提问
我这个只能捕获InputMismatchException异常,要想抛出该异常怎么写。
import java.util.*;
public class Employment {
public static void main(String[] args) throws java.util.InputMismatchException{
// 创建EmpManage对象
EmpManage em = new EmpManage();
Scanner sr = new Scanner(System.in);
// 作出一个菜单
while (true) {
System.out.println("公司职员薪水管理系统");
System.out.println("1、录入新员工");
System.out.println("2、根据工号查询信息");
System.out.println("3、查询所有员工信息");
System.out.println("4、通过工号修改员工薪水");
System.out.println("5、删除员工信息");
System.out.println("6、按薪水高低排序");
System.out.println("7、计算平均工资及最高(低)工资");
System.out.println("0、退出系统");
System.out.print("请输入对应的数字进行操作:");
int sel = sr.nextInt();
switch (sel) {
System.out.println("请录入新员工的信息");
System.out.print("工号(输入-1返回到上一级菜单中):");
String empNo = sr.next();
if (empNo.equals("-1")) {
System.out.print("姓名:");
String name = sr.next();
System.out.print("工资:");
float sal = sr.nextFloat();
// 构建emp对象
Emp emp = new Emp(empNo, name, sal);
// 将empNo,name,sal的值传给构造函数Emp
em.addEmp(emp);
System.out.println("创建新员工" + name + "成功!");
} catch (InputMismatchException e) {
System.out.println("请输入正确格式的工号、姓名和工资" + "\n工号必须为字符串形式"
+ "\n姓名必须为字符串形式" + "\n工资必须为数字类型");
System.out.println("请录入员工工号:");
String empNo1 = sr.next();
em.showInfo(empNo1);
System.out.println("公司所有员工信息如下:");
em.AllInfo();
System.out.println("请输入工号:");
String empNo2 = sr.next();
System.out.println("将工资修改为:");
float newSal = sr.nextFloat();
em.updateSal(empNo2, newSal);
System.out.println("请输入要删除人员的工号:");
String empNo3 = sr.next();
em.delEmp(empNo3);
System.out.println("已按薪资高低进行排序如下:");
em.SortSal();
System.out.println("显示平均工资及最高、最低工资人员信息如下:");
em.Average();
System.out.println("已正常退出!");
System.exit(0);
System.out.println("输入错误,请重新输入!");
// 创建员工管理类
class EmpManage {
private ArrayList al = new ArrayList();
// 加入员工
public void addEmp(Emp emp) {// 传入员工信息
al.add(emp);
// 根据员工工号显示员工的相关信息
public void showInfo(String empNo) {// 将工号传入showInfo方法中
// 遍历整个ArrayList
for (int i = 0; i & al.size(); i++) {
// 取出Emp对象
Emp emp = al.get(i);
// 比较编号
if (emp.getEmpNo().equals(empNo)) {// 由于empNo类型为String,所以要使用equals进行内容比较,不可以使用==地址比较
System.out.println("找到该员工,他的信息是:");
System.out.println("工号:" + empNo + "\t姓号:" + emp.getName()
+ "\t薪水:" + emp.getSal());
System.out.println("工号不存在或者无此人,无法进行相关操作!");
// 显示所有员工信息
public void AllInfo() {
for (int i = 0; i & al.size() - 1; i++) {// ArrayList集合类的al大小,控制循环
for (int j = 1; j & al.size() - j++) {// 将al中的值进行循环比较
Emp emp1 = (Emp) al.get(j - 1);
Emp emp2 = (Emp) al.get(j);
// 使用compareTo方法进行Sting类型值比较
if (emp1.getEmpNo().compareTo(emp2.getEmpNo()) & 0) {
al.set(j, emp1);// 交换值并重写入al中
al.set(j - 1, emp2);// 交换值并重写入al中
for (Emp emp : al) {
System.out.println("工号:" + emp.getEmpNo() + "\t姓名:" + emp.getName()
+ "\t工资:" + emp.getSal());
// 修改员工的薪水
public void updateSal(String empNo, float newSal) {
// 遍历整个ArrayList
for (int i = 0; i & al.size(); i++) {
// 取出Emp对象
Emp emp = (Emp) al.get(i);
if (emp.getEmpNo().equals(empNo)) {
// 修改新水
emp.setSal(newSal);// setSal会将修改的薪水传和ArrayList中
System.out.println("已将" + emp.getName() + "调整为:" + newSal);
System.out.println("工号不存在或无此人,无法进行相应操作!");
// 员工离职删除指定员工
public void delEmp(String empNo) {
// 遍历整个ArrayList
for (int i = 0; i & al.size(); i++) {
// 取出Emp对象
Emp emp = (Emp) al.get(i);
if (emp.getEmpNo().equals(empNo)) {
// 按工号删除
al.remove(i);// 也可以使用al.remove(emp);
System.out.println("已将" + emp.getName() + "信息清除!");
// 按薪水高低排序
public void SortSal() {
for (int i = 0; i & al.size() - 1; i++) {// ArrayList集合类的al大小,控制循环
for (int j = 1; j & al.size() - j++) {// 将al中的值进行循环比较
Emp emp1 = (Emp) al.get(j - 1);
Emp emp2 = (Emp) al.get(j);
if (emp1.getSal() & emp2.getSal()) {// 比较sal的值大小
al.set(j, emp1);// 交换值并重写入al中
al.set(j - 1, emp2);// 交换值并重写入al中
for (Emp emp : al) {
System.out.println("工号:" + emp.getEmpNo() + "\t姓名:" + emp.getName()
+ "\t工资:" + emp.getSal());
// 计算平均工资并找出最高工资和最低工资的员工
public void Average() {
float sum = 0f, ave = 0f;
// 遍历整个ArrayList
for (int k = 0; k & al.size(); k++) {
// 取出Emp对象
Emp emp = (Emp) al.get(k);
sum = emp.getSal() +
ave = sum / al.size();
System.out.println("共有员工" + al.size() + "人\t总工资为:" + sum + "\t平均工资为:"
// 找出最高工资与最低式资
for (int i = 0; i & al.size() - 1; i++) {// ArrayList集合类的al大小,控制循环
for (int j = 1; j & al.size() - j++) {// 将al中的值进行循环比较
Emp emp1 = (Emp) al.get(j - 1);
Emp emp2 = (Emp) al.get(j);
if (emp1.getSal() & emp2.getSal()) {// 比较sal的值大小
al.set(j, emp1);// 交换值并重写入al中
al.set(j - 1, emp2);// 交换值并重写入al中
for (int i = 0; i & al.size(); i++) {
if (i == 0) {
Emp emp = (Emp) al.get(i);
System.out.println("工资最高的人员是:" + emp.getName() + "\t薪水是:"
+ emp.getSal());
} else if (i == al.size() - 1) {
Emp emp = (Emp) al.get(i);
System.out.println("工资最低的人员是:" + emp.getName() + "\t薪水是:"
+ emp.getSal());
// 创建员工类
class Emp {
// 定义成员变量工号、姓名、薪水
public String empNo;
// 创建构造函数,初始化成员变量
public Emp(String empNo, String name, float sal) {
this.empNo = empNo;
this.name =
this.sal =
// 使用set、get方法进行数据传递
public String getEmpNo() {
return empNo;
public void setEmpNo(String empNo) {
this.empNo = empNo;
public String getName() {
public void setName(String name) {
this.name =
public float getSal() {
public void setSal(float sal) {
this.sal =
按赞数排序
在想要抛出该异常的地方,加上一行 throw new InputMismatchException(); 即可。
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐当前位置: →
→ 我调用某个方法时抛出错误,说找不到这个方法,可是明明有的
我调用某个方法时抛出错误,说找不到这个方法,可是明明有的
& 作者:佚名 & 来源: 互联网 & 热度:
&收藏到→_→:
摘要: 我调用某个方法时抛出异常,说找不到这个方法,可是明明有的。错误提示:java.lang.NoSuchMethodException: com.position.acti...
"我调用某个方法时抛出错误,说找不到这个方法,可是明明有的"::
我调用某个方法时抛出异常,说找不到这个方法,可是明明有的。错误提示:: com.position.action.positionaction.getposition()并且页面不显示任何内容!请问个位大侠,出错在哪里呢???????????我的程序如下:action://从中得到教师职称 public string getposition() {
positionlist = (arraylist)iserviceposition.getallposition();
return &getpositionsuccess&; } jsp页面:&body&
&s:form action=&position!getposition&&
&s:select list=&positionlist& name=&position.name& listvalue=&name&
emptyoption=&true& label=&教师职称&&
&/s:select&
&h2 align=&center&&
&a href=&position!browseposition.action&& 管理操作&/a&
&/h2& &/body&------解决方案--------------------1.com.position.action.positionaction编译没过。代码有问题。查。2.clean工程,重新部署。3.清空catalina/work目录
------解决方案--------------------com.position.action.positionaction 这个包名称对不? 搜索此文相关文章:此文来自: 马开东博客
网址: 站长QQ
上一篇:没有了
我调用某个方法时抛出错误,说找不到这个方法,可是明明有的_Eclipse,MyEclipse相关文章
Eclipse,MyEclipse_总排行榜
Eclipse,MyEclipse_最新
Eclipse,MyEclipse_月排行榜
Eclipse,MyEclipse_周排行榜
Eclipse,MyEclipse_日排行榜听说THROW是抛出异常,什么意思,我不太明白怎么抛出异常
[问题点数:20分,结帖人qdxby]
本版专家分:12
结帖率 100%
CSDN今日推荐
本版专家分:2274
2002年9月 荣获微软MVP称号
2002年4月 Windows专区大版内专家分月排行榜第一
2002年6月 Windows专区大版内专家分月排行榜第二2002年5月 Windows专区大版内专家分月排行榜第二
本版专家分:2274
2002年9月 荣获微软MVP称号
2002年4月 Windows专区大版内专家分月排行榜第一
2002年6月 Windows专区大版内专家分月排行榜第二2002年5月 Windows专区大版内专家分月排行榜第二
本版专家分:2274
2002年9月 荣获微软MVP称号
2002年4月 Windows专区大版内专家分月排行榜第一
2002年6月 Windows专区大版内专家分月排行榜第二2002年5月 Windows专区大版内专家分月排行榜第二
本版专家分:41
匿名用户不能发表回复!
其他相关推荐我这里为什么不能捕获异常?【c++吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:304,638贴子:
我这里为什么不能捕获异常?收藏
我这里为什么不能捕获异常?奇怪~应该有标准错误输出啊~~
c++,博为峰IT培训免费试听,0元入学,现在更有多重优惠,仅限今天!博为峰,真正的为年轻人服务的企业,14年间培训15万余名it工程师,成绩斐然!
为什么一运行就崩溃了呢?明明捕获了异常了啊?代码如下:#include &iostream&#include &array&#include &list&#include &vector&#include &string&#include &exception&int main(){
vector&string&
cout&&svec[0];
cout&&svec.at(0);
}catch(runtime_error err)
cout&&err.what();
return 0;}
改 logical error。
catch (std::exception& e)
std::cerr &&"exception caught: "&& e.what() &&'\n';
out_of_range是logic_error不是runtime_error……
运行到std::cout && svec[0];时就垮了,后面的捕捉异常是否正确更不用看了……
为什么没有抛出!?
用at越界才会抛出异常下标运算符不会抛出异常如果用下标运算符越界了后果就要自行承担,程序可能在抛出异常之前已经崩掉了就算抛出异常也是std::out_of_range,runtime_error也不是out_of_range的基类啊至少也要catch (std::exception& e)或者catch (std::logic_error& e)或catch(std::out_of_range& e)吧
楼主是计算机专业的么?
楼主你好,我是新手,就是想问一下,异常处理有什么用啊
是这样的:如果你访问vec.at(i);//i会被自动转化为无符号整数。那么实际上这个等价于这个:if(vec.size()&=i)
throw std::out_of_range("vector越界");return vec[0];楼主既然学了异常,就应该知道只有用throw抛出的异常才会被catch捕获的。但如果你直接执行vec[0]这个就没有throw,因而catch无法捕获。很明显,如果真的让你去执行vec[0],由于这个行为是未定义的。实际上操作系统不会真的去执行vec[0]这个代码,操作系统会通过一定的检测机制,去检测你是否访问了无效内存地址。如果访问了,会向你发送一个SIGSEGV的信号,这个信号的默认处理方式不是像C++那样throw一个exception的,默认的行为就是直接结束这个程序。如果你想改变发送了SIGSEGV信号以后的行为你需要void change(int s){
std::cout&&"A SIGSEGV exception occurs."&&std::
std::exit(1);}std::signal(SIGSEGV,change);这样的话当发现你访问了无效内存地址时,就不再直接结束这个程序,取而代之的是去调用change()。对于SIGSEGV调用的这个函数,你必须让这个函数将程序终止掉,所以最后执行std::exit(1);来结束程序。你或许会想,既然如此,那么我将change函数写成这样如何:void change(int s){
throw std::out_of_range("vector越界");}如果真的访问了,他不是可以throw然后被我外边的catch捕获么?实际则是不可以,catch捕获不到。因为这套系统异常机制和C++/JAVA/C#那套异常处理不是一回事。
对了,runtime_error这种方式还是错误的,因为C++必须用引用或指针或者智能指针一类的才能实现多态,正确的写法如下:catch(std::exception &ex)
我想我找到了一条相对可行的解决系统异常安全的办法。。就是把极其重要的资源放在未命名的namespace全局或者在类内部static就好。程序执行结果如下:
C++只管同步异常,也就是能确定哪里可能抛出的异常。访问违例和浮点异常等一般可以被实现为硬件支持的异步异常,C++不要求能处理这些异常。
class TV;class Remote{public:enum state{off,on};enum{Minval,Maxval=20};
enum{Antenna,Cable};enum{TV,VCR};private:public:Remote (int m=TV):mode(m){}、---、m=TV?这是什么意思?
帮忙看下了谢谢楼主
书本上就是这样写的。那个mode那样子就是使他初始化
: C艹只是照搬C:WG14/N15707.144 An implementation need not generate any of these signals, except as a result of explicitcalls to the raise function. Additional signals and pointers to undeclarable functions,with macro definitions beginning, respectively, with the letters SIG and an uppercaseletter or with SIG_ and an uppercase letter,250) may also be specified by theimplementation. The complete set of signals, their semantics, and their default handlingis implementation- all signal numbers shall be positive.
登录百度帐号为什么我抛出的异常没有显示后面的原因?_百度知道
为什么我抛出的异常没有显示后面的原因?
如图,我抛出的异常:”年龄不能小于0“为什么没显示出来啊...
如图,我抛出的异常:”年龄不能小于0“为什么没显示出来啊
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:68
获赞数:60
因为转换的时候已经异常了 所以直接跳catch 根本就走不到你的if判断那
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。

我要回帖

更多关于 抛出异常 的文章

 

随机推荐