这实际上是我写的第一个程序(上周一开始学习);我是个新手。
我的问题是,当程序提示用户输入fahreinheit或celsius条目(期待一个数字)时,如何防止用户输入无效字符时抛出异常?因此,例如,当用户输入“asfasd”时,程序会抛出异常。
我在发布之前在网站上做了很多搜索,我成功地找到了其他输入验证问题,但是,他们都是关于C和C ++的,因为我是一个新手,我很难过了解这些语言以及它们与C#的关系。谢谢。请参阅代码:
@POST
@Path("/loaduser")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void getinfo(employeedatapojo emp, MethodCallback < employeedatapojo > methodCallback);
//doa
@RequestMapping(value = "/loaduser", method = RequestMethod.POST, headers = "Accept=application/json")
public @ResponseBody employeedatapojo getinfo(@RequestBody employeedatapojo emp, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException, SQLException {
boolean status = false;
employeedatapojo empobj = new employeedatapojo();
emplyoeedao obj1 = new emplyoeedao();
empobj = obj1.returnempobject(emp.getemployeeid());
System.out.println("languages inside loaduse restgwt" + empobj.getlanguages());
return empobj;
}
//AT the ui side
//load user is executing but response is not coming
InfoService.Util.getService().loaduser(emp1, new MethodCallback < employeedatapojo > () {
@Override
public void onSuccess(Method method, employeedatapojo response) {
Window.alert("inside user info after receiving object");
}
@Override
public void onFailure(Method method, Throwable exception) {
Window.alert("not assigned ");
}
}
答案 0 :(得分:4)
TryParse
是你在这里的好朋友。在大多数情况下,您应该使用Parse
而不是int validInt;
int.TryParse(Console.ReadLine(), out validInt);
float validFloat;
float.TryParse(Console.ReadLine(), out validFloat);
。在您的示例中,您可以执行以下操作:
$(document).ready(function(){
$('#random-select').change(function()
{
alert($(this).val());
});
});
</script>
答案 1 :(得分:4)
您可以将其放入Try-Catch块或使用while循环来验证用户输入。
下面是带有while循环的代码,用于验证用户输入。
class Program
{
static void Main(string[] args)
{
double FahrenheitInput = 0;
double CelsiusInput = 0;
double KilogramInput = 0;
double PoundsInput = 0;
int UserChoice = 0;
do
{
Console.WriteLine("What would you like to convert? Enter the corresponding number.\n1. Fahrenheit to Celsius");
Console.WriteLine("2. Celsius to Fahrenheit\n3. Pounds to Kilograms\n4. Kilograms to pounds\n5. Exit program");
UserChoice = int.Parse(Console.ReadLine());
switch (UserChoice)
{
case 1:
Console.WriteLine("Enter the temperature in Fahreinheit, number only:");
while (!double.TryParse(Console.ReadLine(), out FahrenheitInput))
{
Console.WriteLine("Invalid format, please input again!");
};
Console.Clear();
Console.WriteLine(FahrenheitInput + " degrees fahrenheit in Celsius is " + Program.FahrenheitToCelsius(FahrenheitInput) + "\n\n");
break;
case 2:
Console.WriteLine("Enter the temperature in Celsius, number only:");
while (!double.TryParse(Console.ReadLine(), out CelsiusInput))
{
Console.WriteLine("Invalid format, please input again!");
};
Console.Clear();
Console.WriteLine(CelsiusInput + " degrees Celius in fahrenheit is " + Program.CelsiusToFahrenheit(CelsiusInput) + "\n\n");
break;
case 5:
break;
default:
Console.WriteLine("This is not a valid entry. Please enter 1, 2, 3, 4, or 5.");
break;
}
} while (UserChoice != 5);
}
public static double FahrenheitToCelsius(double INPUT)
{
return (INPUT - 32) * 5 / 9;
}
public static double CelsiusToFahrenheit(double INPUT)
{
return INPUT * 1.8 + 32;
}
}
答案 2 :(得分:2)
改变例程的最简单方法是将Parse
重写为相应的TryParse
:
// UserChoice = int.Parse(Console.ReadLine());
UserChoice = int.TryParse(Console.ReadLine(), out UserChoice) ? UserChoice : -1;
...
有点复杂(您必须将float
转换为float?
)
// FahrenheitInput = float.Parse(Console.ReadLine());
float v;
FahrenheitInput = float.TryParse(Console.ReadLine(), out v) ? (float?) v : null;
CelsiusInput
// CelsiusInput = double.Parse(Console.ReadLine());
double d;
CelsiusInput = double.TryParse(Console.ReadLine(), out v) d (double?) d : null;
代码的基础机制是
TryParse(Console.ReadLine()...
TryParse
返回true
),我们只返回out(解析后的值)。TryParse
返回false
),我们会返回一些特殊值(-1
UserChoice
或{{1}如果是null
或FahrenheitInput
)CelsiusInput
中的 P.S。,switch
,case 1
和case 2
;但是,你已经说“这不是一个有效的条目。请输入1,2, 3,4,或5.”在错误消息中。看来,您必须在case 5
中实施case 3 and case 4
或编辑错误消息。
答案 3 :(得分:1)
使用private void Connection_StateChanged(StateChange obj)
{
if (obj.NewState == ConnectionState.Disconnected)
{
var current = DateTime.Now.TimeOfDay;
SetTimer(current.Add(TimeSpan.FromSeconds(30)), TimeSpan.FromSeconds(10), StartCon);
}
else
{
if (_timer != null)
_timer.Dispose();
}
}
private async Task StartCon()
{
await Connection.Start();
}
private Timer _timer;
private void SetTimer(TimeSpan starTime, TimeSpan every, Func<Task> action)
{
var current = DateTime.Now;
var timeToGo = starTime - current.TimeOfDay;
if (timeToGo < TimeSpan.Zero)
{
return;
}
_timer = new Timer(x =>
{
action.Invoke();
}, null, timeToGo, every);
}
代替int.TryParse
和int.Parse
代替float.tryParse
答案 4 :(得分:0)
虽然提供的所有答案似乎都有效,但您提出的问题是
如何防止异常被抛出[...]
我只是想指出你通过将exception
放在try
- catch
块中的部分来实现这一点。它的作用是执行try
中的代码,直到exception
被抛出,然后将此exception
作为参数传递给catch
- 您可以处理的部分它:
示例强>
do
{
try
{
// the code you already have
}
catch (Exception ex)
{
Console.WriteLine("This is no valid input (" + ex.Message + ")! Try again...");
}
} while (UserChoice != 5);
当然,首先阻止exception
完全放弃throw
n是更好的方式(正如所有其他答案所建议的那样),但这种方法也有效,并且更通用如果您将来遇到类似的问题。使用switch
- case
- 语句进行错误处理是非常常见的做法......